/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.security.keymint;

/**
 * MacedPublicKey contains a CBOR-encoded public key, MACed by an IRemotelyProvisionedComponent, to
 * prove that the key pair was generated by that component.
 * @hide
 */
@VintfStability
parcelable MacedPublicKey {
    /**
     * key is a COSE_Mac0 structure containing the new public key.  It's MACed by a key available
     * only to the secure environment, as proof that the public key was generated by that
     * environment. In CDDL, assuming the contained key is a P-256 public key:
     *
     *     MacedPublicKey = [                     // COSE_Mac0
     *         protected: bstr .cbor { 1 : 5},    // Algorithm : HMAC-256
     *         unprotected: { },
     *         payload : bstr .cbor PublicKey,
     *         tag : bstr HMAC-256(K_mac, MAC_structure)
     *     ]
     *
     *     PublicKey = {               // COSE_Key
     *         1 : 2,                  // Key type : EC2
     *         3 : -7,                 // Algorithm : ES256
     *         -1 : 1,                 // Curve : P256
     *         -2 : bstr,              // X coordinate, little-endian
     *         -3 : bstr,              // Y coordinate, little-endian
     *         ? -70000 : nil          // Presence indicates this is a test key.  If set, K_mac is
     *                                 // all zeros.
     *     },
     *
     *     MAC_structure = [
     *         context : "MAC0",
     *         protected : bstr .cbor { 1 : 5 },
     *         external_aad : bstr .size 0,
     *         payload : bstr .cbor PublicKey
     *     ]
     *
     * if a non-P256 public key were contained, the contents of the PublicKey map would change a
     * little; see RFC 8152 for details.
     */
    byte[] macedKey;
}
